package com.cuiyun97.handler;

import com.cuiyun97.constant.MessageConstant;
import com.cuiyun97.exception.AdminException;
import com.cuiyun97.exception.BaseException;
import com.cuiyun97.exception.H5Exception;
import com.cuiyun97.result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 全局异常处理
     *
     * 这个是运行时异常, 直接打印错误提示
     *
     * @param e
     * @return
     */
    // 这个会拦截掉SQL异常
    @ExceptionHandler(Exception.class)
    public Result exceptionHandler(Exception e) {
        e.printStackTrace();
        return Result.error(e.getMessage());
    }

    /**
     * 自定义全局异常处理
     *
     * 这里提示: 联系管理员
     * 基本上不会使用这个, 用AdminException, H5Exception代替
     *
     * @param e
     * @return
     */
    @ExceptionHandler(BaseException.class)
    public Result exceptionHandler(BaseException e) {
        e.printStackTrace();
        return Result.error(MessageConstant.ADMIN_ERROR);
    }

    /**
     * 自定义后台异常处理
     *
     * 自定义错误提示
     *
     * @param e
     * @return
     */
    @ExceptionHandler(AdminException.class)
    public Result exceptionHandler(AdminException e) {
        e.printStackTrace();
        return Result.error(e.getMessage());
    }

    /**
     * 自定义前端异常处理
     *
     * 自定义错误提示
     *
     * @param e
     * @return
     */
    @ExceptionHandler(H5Exception.class)
    public Result exceptionHandler(H5Exception e) {
        e.printStackTrace();
        return Result.error(e.getMessage());
    }

    /**
     * SQL异常处理
     *
     * 拦截SQL操作异常, 给出对应提示
     *
     * @param e
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public Result exceptionHandler(SQLIntegrityConstraintViolationException e) {
        e.printStackTrace();

        // 字段不能重复异常
        // Duplicate entry 'abc' for key 'username'
        String message = e.getMessage();
        if (message.contains("Duplicate entry")) {
            String[] split = message.split(" ");
            String username = split[2];
            String msg = username + MessageConstant.ALREADY_EXISTS;
            return Result.error(msg);
        }

        return Result.error(MessageConstant.UNKNOWN_ERROR);
    }
}
